Le paysage moderne de l'optimisation CUDA représente un changement de paradigme d'une exécution traditionnelle par flux limitée par le CPU vers un écosystème autonome et accéléré par matériel. Ce changement réduit au minimum les surcharges côté hôte en déléguant directement à l'unité graphique (GPU) l'allocation de mémoire, la synchronisation et l'envoi des noyaux.
1. Évolution de l'interface logiciel-matériel
L'optimisation commence avec le pilote. Les applications modernes utilisent cuInit et cuModuleLoad pour gérer les modules. Une fonctionnalité clé est Chargement différé (CUDA_MODULE_LOADING=LAZY), où les fonctions ne sont chargées dans le contexte GPU qu'à leur première invocation, ce qui réduit considérablement la consommation mémoire et le temps de démarrage.
2. Compatibilité binaire et JIT
La performance est maintenue entre les générations grâce à PTX (exécution parallèle de threads) et cubin. Le compilateur JIT s'assure que le PTX de haut niveau est optimisé pour le ensemble de fonctionnalités spécifique à l'architecture de la GPU cible à l'exécution. Compiler contre CUDA 11.3, par exemple, permet d'exécuter sur des pilotes 11.4 sans recompilation grâce à la compatibilité ABI.
3. Limites des ressources et de l'exécution
L'exécution moderne est régulée par une cartographie rigoureuse des ressources entre tampons de paramètres (PB) et blocs de threads (TB). Cela s'exprime mathématiquement comme suit :
$$PB = \{BP_0, BP_1, \dots, BP_L\}, \quad TB = \{BT_0, BT_1, \dots, BT_L\}$$
où la validation des contraintes matérielles garantit que $$BT_n \le BP_m$$ pour $$n \le m$$. Ce cadre permet des lancements autonomes via cudaLaunchDevice tout en restant dans les limites matérielles.
4. Primitives de gestion proactive
L'optimisation requiert désormais une visibilité globale des données gérées. Des primitives telles que cudaMemPrefetchAsync et le allocateur système permettent au GPU de préparer les données avant l'entrée du noyau, éliminant ainsi les goulets d'étranglement synchrones sur les plateformes hétérogènes comprenant processeurs Arm et cartes graphiques NVIDIA.